package domino;

import java.util.*;

interface Observer {

    void Actualizar(String mensaje);
    void ActualizarFichas(Iterable<Ficha> fichas);
    void comerFicha(Ficha ficha);
    void mostrarTren(Tren t);
    void setMotor(Ficha motor);
    void iniciarTurno();
    void actualizaInterfaz();
}

class Subject {

    protected ArrayList<Observer> observadores;

    public Subject() {
        observadores = new ArrayList<>();
    }

    public void registrar(Observer observador) {
        observadores.add(observador);
    }

    protected void informar(String mensaje) {
        Iterator<Observer> it = observadores.iterator();
        while (it.hasNext()) {
            Observer o = it.next();
            o.Actualizar(mensaje);
        }
    }

    protected void enviarFichas(Iterable<Ficha> fichas) {
        Iterator<Observer> it = observadores.iterator();
        while (it.hasNext()) {
            Observer o = it.next();
            o.ActualizarFichas(fichas);
        }
    }

    protected void comerFicha(Ficha ficha) {
        Iterator<Observer> it = observadores.iterator();
        while (it.hasNext()) {
            Observer o = it.next();
            o.comerFicha(ficha);
        }
    }

    protected void enviarTren(Tren tren) {
        Iterator<Observer> it = observadores.iterator();
        while (it.hasNext()) {
            Observer o = it.next();
            o.mostrarTren(tren);
        }
    }
    
    protected void setMotor(Ficha motor){
        Iterator<Observer> it = observadores.iterator();
        while (it.hasNext()) {
            Observer o = it.next();
            o.setMotor(motor);
        }        
    }
    
    protected void iniciarTurno(){
        for(Observer observer : observadores){
            observer.iniciarTurno();
        }
    }
    
    protected void actualizaInterfaz() {
        for(Observer observer : observadores){
            observer.actualizaInterfaz();
        }
    }
}